//MODUL STACK }
//Deklarasi stack yang diimplementasi dengan list linier }
//dengan representasi fisik pointer }
//TOP adalah alamat elemen puncak }

#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include "BOOLEAN.h"
#include <stdlib.h>
#include <stdio.h>
#define Nil NULL

/* Deklarasi infotype */
typedef struct {
	int x;
	int y;
}infotype;

/* Stack dengan representasi berkait dengan pointer */
typedef struct tElmtStack * address;
typedef struct tElmtStack {
       infotype Info;
       address Next;
} ElmtStack;

/* Type stack dengan ciri TOP : */
typedef struct {
       address TOP; /* alamat TOP: elemen puncak */
} Stack;

/* Selektor */
#define Top(S) (S).TOP
#define InfoTop(S) (S).TOP->Info
#define Next(P) (P)->Next
#define Info(P) (P)->Info

// ********* Prototype **********

// *** Konstruktor/Kreator ***
void CreateEmpty (Stack * S);
/* I.S. sembarang */
/* F.S. Membuat sebuah stack S yang kosong */

// *** Prototype manajemen memori ***
void Alokasi (address *P, infotype X);
/* I.S. Sembarang */
/* F.S. Alamat P dialokasi, jika berhasil maka Info(P)=X dan
        Next(P)=Nil */
/*P=Nil jika alokasi gagal */

void Dealokasi (address *P);
/* I.S. P adalah hasil alokasi, P <> Nil */
/* F.S. Alamat P didealokasi, dikembalikan ke sistem */

// ********* Predikat Untuk test keadaan KOLEKSI **********
boolean IsEmpty (Stack S);
/* Mengirim true jika Stack kosong: TOP(S) = Nil */

// boolean IsFull(Stack S);
// // Mengirim true jika tabel penampung nilai elemen stack penuh }

// ********** Operator Dasar Stack ********* 
void Push (Stack * S, infotype X);
/* Menambahkan X sebagai elemen Stack S */
/* I.S. S mungkin kosong, X terdefinisi */
/* F.S. X menjadi TOP yang baru jika alokasi X berhasil, */
/*jika tidak, S tetap */
/* Pada dasarnya adalah operasi Insert First pada list linier */

void PushUnik (Stack * S, infotype X);

void Pop (Stack * S, infotype * X);
/* Menghapus X dari Stack S. */
/* I.S. S tidak mungkin kosong */
/* F.S. X adalah nilai elemen TOP yang lama, */
/*elemen TOP yang lama didealokasi */
/* Pada dasarnya adalah operasi Delete First pada list linier */

int NbElmt(Stack S);
boolean Contains(Stack S,infotype X);
boolean PushFill(Stack * S, infotype X);
boolean PopFill(Stack * S, infotype * X);
#endif
